/**
 * @作者 钟先崟
 * @时间 2023-02-26 14:44
 * @说明 6. N 字形变换
 * 将一个给定字符串 s 根据给定的行数 numRows ，以从上往下、从左到右进行 Z 字形排列。
 * 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时，排列如下：
 * P   A   H   N
 * A P L S I I G
 * Y   I   R
 * 之后，你的输出需要从左往右逐行读取，产生出一个新的字符串，比如："PAHNAPLSIIGYIR"。1,3,5,7,9
 * P     A     N
 * P   A H   N G
 * A P   I G   A
 * Y     I     R
 */
public class Solution {
    public static void main(String[] args) {
//        System.out.println(convert("PAYPALISHIRING", 3));
//        System.out.println(convert("PAYPALISHIRING", 4));
//        System.out.println(convert("A", 1));
        System.out.println(convert("AB", 1));
    }

    /**
     * 执行用时：
     * 2 ms
     * , 在所有 Java 提交中击败了
     * 98.69%
     * 的用户
     * 内存消耗：
     * 41.8 MB
     * , 在所有 Java 提交中击败了
     * 76.74%
     * 的用户
     * @param s
     * @param numRows
     * @return
     */
    public static String convert(String s, int numRows) {
        if (numRows == 1) return s;
        int len = s.length();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < numRows; i++) {
            int j = i;
            if (j == 0 || j == numRows - 1) {
                while (j < len) {
                    sb.append(s.charAt(j));
                    j += 2 * numRows - 3 + 1;
                }
            } else {
                int flag = 0;
                int addflag0 = 2 * (numRows - i) - 3 + 1;
                int addflag1 = 2 * numRows - 3 + 1 - addflag0;
                while (j < len) {
                    sb.append(s.charAt(j));
                    if (flag == 0) {
                        j += addflag0;
                        flag = 1;
                    } else {
                        j += addflag1;
                        flag = 0;
                    }
                }
            }
        }
        return String.valueOf(sb);
    }
}
